const express = require('express');
const mongoose = require('mongoose');
const cors = require('cors');
const axios = require('axios');
require('dotenv').config();

const app = express();
const PORT = process.env.PORT || 5000;

// 中间件
app.use(cors());
app.use(express.json());

// 连接 MongoDB
mongoose.connect(process.env.MONGODB_URI || 'mongodb://45.136.197.158:27017/classroom', {
  useNewUrlParser: true,
  useUnifiedTopology: true,
})
.then(() => console.log('MongoDB 连接成功'))
.catch(err => console.error('MongoDB 连接失败:', err));

// 问题模型
const questionSchema = new mongoose.Schema({
  content: String,
  studentName: String,
  studentId: String,
  timestamp: { type: Date, default: Date.now },
  category: String,
  analysis: {
    coreKnowledge: String,
    learningPath: String,
    difficulty: String,
    solution: String,
    extension: String,
    suggestion: String
  }
});

const Question = mongoose.model('Question', questionSchema);

// 知识库定义
const knowledgeBase = {
  'html': {
    title: 'HTML 基础知识',
    content: `HTML（超文本标记语言）是构建网页的基础。以下是学习 HTML 的要点：

1. 基本概念：
   - HTML 是网页的骨架
   - 使用标签定义内容结构
   - 最新版本是 HTML5

2. 核心标签：
   - <html>: 文档根元素
   - <head>: 文档头部
   - <body>: 文档主体
   - <div>: 块级容器
   - <p>: 段落
   - <a>: 链接
   - <img>: 图片

3. 学习路径：
   - 第一阶段：基础标签
   - 第二阶段：表单和表格
   - 第三阶段：HTML5 新特性
   - 第四阶段：语义化标签

4. 推荐资源：
   - MDN Web Docs
   - W3School
   - 菜鸟教程`
  },
  'css': {
    title: 'CSS 样式指南',
    content: `CSS（层叠样式表）用于美化网页。以下是学习 CSS 的要点：

1. 基本概念：
   - CSS 控制网页样式
   - 选择器定义样式规则
   - 盒模型是核心概念

2. 核心特性：
   - 选择器
   - 盒模型
   - 定位
   - 弹性布局
   - 响应式设计

3. 学习路径：
   - 基础选择器
   - 盒模型
   - 布局技术
   - 动画效果
   - 响应式设计

4. 推荐资源：
   - CSS-Tricks
   - MDN CSS 文档
   - 阮一峰 CSS 教程`
  },
  'java': {
    title: 'Java 编程指南',
    content: `Java 是一种广泛使用的编程语言。以下是学习 Java 的要点：

1. 基本概念：
   - 面向对象编程
   - 平台无关性
   - JVM 工作原理

2. 核心特性：
   - 类和对象
   - 继承和多态
   - 异常处理
   - 集合框架
   - 多线程

3. 学习路径：
   - Java 基础语法
   - 面向对象编程
   - 常用类库
   - 框架学习
   - 项目实战

4. 推荐资源：
   - Java 官方文档
   - 《Java 核心技术》
   - 慕课网 Java 教程`
  },
  '数据库': {
    title: '数据库学习指南',
    content: `数据库是存储和管理数据的系统。以下是学习数据库的要点：

1. 基本概念：
   - 关系型数据库
   - SQL 语言
   - 数据库设计

2. 核心内容：
   - 数据建模
   - SQL 查询
   - 索引优化
   - 事务处理
   - 数据库安全

3. 学习路径：
   - 数据库基础
   - SQL 语言
   - 数据库设计
   - 性能优化
   - 高级特性

4. 推荐资源：
   - 《SQL 必知必会》
   - MySQL 官方文档
   - 数据库设计教程`
  }
};

// 分类函数
async function categorizeQuestion(content) {
  try {
    // 关键词匹配分类
    let matchedCategory = null;
    let maxMatches = 0;

    for (const [category, definition] of Object.entries(categoryDefinitions)) {
      const matches = definition.keywords.filter(keyword => 
        content.toLowerCase().includes(keyword.toLowerCase())
      ).length;

      if (matches > maxMatches) {
        maxMatches = matches;
        matchedCategory = category;
      }
    }

    const category = matchedCategory || '其他类问题';
    const analysis = await getQuestionAnalysis(content);

    return {
      category,
      analysis
    };
  } catch (error) {
    console.error('分类失败:', error.message);
    return {
      category: '其他类问题',
      analysis: {
        coreKnowledge: '无法确定核心知识点',
        learningPath: '无法提供学习路径',
        difficulty: '无法确定理解难点',
        solution: '无法提供解答思路',
        extension: '无法提供扩展知识',
        suggestion: '无法提供教学建议'
      }
    };
  }
}

// 获取问题分析
async function getQuestionAnalysis(content) {
  try {
    console.log('正在发送请求到 Ollama API...');
    console.log('请求内容:', content);
    
    const requestData = {
      model: "deepseek-r1:1.5b",
      prompt: `请分析以下问题，并提供详细的相关知识：

问题：${content}

请提供以下内容：
1. 问题解析：分析问题的核心内容和意图
2. 相关知识：提供与问题相关的知识点和概念
3. 学习建议：给出具体的学习路径和方法
4. 实践指导：提供实际应用的建议和示例
5. 扩展阅读：推荐相关的学习资源和参考资料

请用简洁明了的语言回答，确保内容实用且易于理解。`,
      stream: false,
      temperature: 0.7,
      max_tokens: 1000
    };

    console.log('请求数据:', JSON.stringify(requestData, null, 2));

    const response = await axios.post('http://127.0.0.1:11434/api/generate', requestData, {
      headers: {
        'Content-Type': 'application/json'
      },
      timeout: 60000
    });

    console.log('Ollama API 响应状态:', response.status);
    console.log('Ollama API 响应数据:', JSON.stringify(response.data, null, 2));
    
    if (!response.data || !response.data.response) {
      console.error('无效的 API 响应:', response.data);
      throw new Error('无效的 API 响应');
    }

    const analysis = response.data.response.trim();
    console.log('分析结果:', analysis);

    return {
      analysis: analysis
    };
  } catch (error) {
    console.error('获取分析失败:', error.message);
    console.error('错误详情:', error);
    
    if (error.code === 'ECONNREFUSED') {
      return {
        analysis: '无法连接到 Ollama 服务，请确保 Ollama 服务已启动。\n' +
                 '错误信息：' + error.message + '\n' +
                 '请检查：\n' +
                 '1. Ollama 服务是否正在运行\n' +
                 '2. 端口 11434 是否被占用\n' +
                 '3. 防火墙设置是否正确'
      };
    }
    
    if (error.response) {
      console.error('API 错误响应:', error.response.data);
    }
    
    return {
      analysis: '分析服务暂时不可用，请稍后重试。\n' +
               '错误信息：' + error.message
    };
  }
}

// 路由
app.get('/api/questions', async (req, res) => {
  try {
    const questions = await Question.find().sort({ timestamp: -1 });
    res.json(questions);
  } catch (error) {
    console.error('获取问题列表失败:', error);
    res.status(500).json({ error: '获取问题列表失败' });
  }
});

app.post('/api/questions', async (req, res) => {
  try {
    const { content, studentName, studentId } = req.body;
    const question = new Question({ content, studentName, studentId });
    await question.save();
    res.status(201).json(question);
  } catch (error) {
    console.error('保存问题失败:', error);
    res.status(500).json({ error: '保存问题失败' });
  }
});

app.post('/api/categorize', async (req, res) => {
  try {
    console.log('收到分析请求:', req.body);
    const { questions } = req.body;

    if (!questions || !Array.isArray(questions) || questions.length === 0) {
      console.error('无效的问题数据:', questions);
      return res.status(400).json({ error: '无效的问题数据' });
    }

    // 验证每个问题
    const validQuestions = questions.filter(q => q.content && q.content.trim());
    if (validQuestions.length === 0) {
      console.error('没有有效的问题内容');
      return res.status(400).json({ error: '没有有效的问题内容' });
    }

    // 对每个问题进行分析
    const updatedQuestions = [];
    for (const question of validQuestions) {
      const result = await getQuestionAnalysis(question.content);
      
      // 解析 AI 返回的分析内容
      const analysisContent = result.analysis;
      const analysisSections = {
        coreKnowledge: '',
        learningPath: '',
        difficulty: '',
        solution: '',
        extension: '',
        suggestion: ''
      };

      // 提取各个部分的内容
      const sections = analysisContent.split('\n\n');
      sections.forEach(section => {
        if (section.includes('问题解析')) {
          analysisSections.coreKnowledge = section.split('问题解析：')[1]?.trim() || '';
        } else if (section.includes('相关知识')) {
          analysisSections.learningPath = section.split('相关知识：')[1]?.trim() || '';
        } else if (section.includes('学习建议')) {
          analysisSections.difficulty = section.split('学习建议：')[1]?.trim() || '';
        } else if (section.includes('实践指导')) {
          analysisSections.solution = section.split('实践指导：')[1]?.trim() || '';
        } else if (section.includes('扩展阅读')) {
          analysisSections.extension = section.split('扩展阅读：')[1]?.trim() || '';
        }
      });

      // 更新数据库中的问题记录
      const updatedQuestion = await Question.findByIdAndUpdate(
        question._id,
        { 
          analysis: analysisSections,
          updatedAt: new Date()
        },
        { new: true }
      );

      updatedQuestions.push(updatedQuestion);
    }

    res.json({
      questions: updatedQuestions
    });

  } catch (error) {
    console.error('问题分析失败:', error);
    res.status(500).json({ 
      error: '问题分析失败',
      details: error.message
    });
  }
});

// 启动服务器
app.listen(PORT, () => {
  console.log(`服务器运行在端口 ${PORT}`);
});